//
//  HPPictureController.swift
//  MyWeibo
//
//  Created by apple on 16/4/28.
//  Copyright © 2016年 Apengpeng. All rights reserved.
//

import UIKit

private let reuseIdentifier = "Cell"

// 定义间距
private let cellMargin: CGFloat = 3
private let count: CGFloat = 4

// 设置最大可选图片数
private let maxImageCount = 9

class HPPictureController: UICollectionViewController {
    
//    // 重写了init 方法后   UICollectionViewController() 初始化方法不能使用
//    override init(collectionViewLayout layout: UICollectionViewLayout) {
//        super.init(collectionViewLayout: layout) 
//    }
    
    // 定义变量, 用来存放选择的图片
    lazy var imageList: [UIImage] = [UIImage]()
    
    // 重写init方法
    init() {
        // 设置layout
        let layout = UICollectionViewFlowLayout()
        let itemW = (screenWidth - (count + 1) * cellMargin) / count
        layout.itemSize = CGSizeMake(itemW, itemW)
        layout.minimumLineSpacing = cellMargin
        layout.minimumInteritemSpacing = cellMargin
        // 设置item 的内边距
        layout.sectionInset = UIEdgeInsets(top: cellMargin, left: cellMargin, bottom: cellMargin, right: cellMargin)
        super.init(collectionViewLayout: layout)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // Register cell classes
        self.collectionView!.registerClass(HPCollectionViewCell.self, forCellWithReuseIdentifier: reuseIdentifier)

        // Do any additional setup after loading the view.
        collectionView!.backgroundColor = UIColor.blueColor()
    }



    // MARK: UICollectionViewDataSource

    override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        // #warning Incomplete implementation, return the number of sections
        return 1
    }


    override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        // #warning Incomplete implementation, return the number of items
//        return imageList.count + 1
        
        let detla = imageList.count >= maxImageCount ? 0 : 1
        return imageList.count + detla
    }

    override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        // cell 的 类型是UICollectionViewCell , 需要转换为自定义的cell
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! HPCollectionViewCell
    
        cell.backgroundColor = randomColor()
        
        // 点击cell 时 需要添加或者是删除图片, 使用代理
        cell.delegate = self
        
        // 给自定义cell 的image 属性赋值
//        cell.image = imageList[indexPath.item]  // 程序crash数组越界, 开始时数组的长度为0
        // 需要判断
        if indexPath.item == imageList.count {// item去图片时,数组的长度为0 会越界
            // 刚开始时 有一个图片添加按钮
            cell.image = nil
            // 删除按钮隐藏
            cell.deleBtn.hidden = true
            
        } else {
            // 删除按钮显示
            cell.deleBtn.hidden = false
            // 设置图片
            cell.image = imageList[indexPath.item]
        }
        
        return cell
    }
}


//MARK: 代理方法实现
extension HPPictureController: HPCollectionViewCellDelegate {
    
    // MARK: 将要选择图片
    func userWillChosePicture() {
        
        // 打开图片选择器, 打开之前需要判断图片的来源是否可用
        // 如果是照相机, 需要判断相机是否可用, 是前置还是后置摄像头
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.SavedPhotosAlbum) {
            let picker = UIImagePickerController()
            // 图片可编辑
            picker.allowsEditing = true
            picker.delegate = self
            
            presentViewController(picker, animated: true, completion: nil)
            
        }
        print("将要选择图片")
    }
    
    // MARK: 将要删除图片, 需要带个cell 的参数
    func userWillDeletePicture(cell: HPCollectionViewCell) {
       
        //获取点击的那个cell
            // 根据选中的cell 获取indexPath
        if let indexPath = collectionView?.indexPathForCell(cell) {
            
            // 在数组中移除对应 indexPath索引对应的item元素
            imageList.removeAtIndex(indexPath.item)
            // 刷新数据
            collectionView?.reloadData()
        }
        
        print("将要删除")
    }
}

// UIImagePickerViewController 的代理方法     必须遵守Nav 的代理协议
extension HPPictureController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    // 重写了次方法后, 需要程序员管理UIImagePickViewController 的 dismiss
    func imagePickerController(picker: UIImagePickerController, didFinishPickingImage image: UIImage, editingInfo: [String : AnyObject]?) {
    
        imageList.append(image)
        
        // 将来需要用数组的数据, 需要刷新数据
        self.collectionView?.reloadData()
        
        dismissViewControllerAnimated(true, completion: nil)
    }
}




// 定义协议
@objc protocol HPCollectionViewCellDelegate: NSObjectProtocol {
    
    // 定义协议方法
    // 定义可选的协议方法是需要加上@objc
    optional func userWillChosePicture()
    optional func userWillDeletePicture(cell: HPCollectionViewCell)
    
}

//自定义cell的类
class HPCollectionViewCell: UICollectionViewCell {
    
    
    // 拥有image 模型, 在didSet 中绑定数据
    var image: UIImage? {
        
        didSet {
            // 也可在数据绑定的时候 判断删除按钮是否隐藏
            deleBtn.hidden = image == nil // 如果为 nil 表示 false, 否则为true
            addBtn.setImage(image, forState: .Normal)
        }
    }
    
    // 代理对象, 为可选项, 否则要初始化
    weak var delegate: HPCollectionViewCellDelegate?
    
    // init cell 的frame
    override init(frame: CGRect) {
        super.init(frame: frame)
        
        setupUI()
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    // MARK: 按钮的点击事件
    @objc private func addPictBtnDidClick() {
        
        // 判断如果有图片了, 就不要再添加了
        if image != nil {
            return
        }
        
        delegate?.userWillChosePicture!()
    }
    
    @objc private func deleteBtnDidClick() {
        
        // 此处的参数需要一个cell  为self
        delegate?.userWillDeletePicture!(self)
    }
    
    private func setupUI() {
        
        contentView.addSubview(addBtn)
        contentView.addSubview(deleBtn)
        
        addBtn.snp_makeConstraints { (make) -> Void in
            make.edges.equalTo(contentView.snp_edges)
        }
        
        deleBtn.snp_makeConstraints { (make) -> Void in
            make.top.right.equalTo(contentView)
        }
        
    }
    
    private lazy var addBtn: UIButton = {
        let pictBtn = UIButton()
        pictBtn.setBackgroundImage(UIImage(named: "compose_pic_add"), forState: .Normal)
        pictBtn.setBackgroundImage(UIImage(named: "compose_pic_add_highlighted"), forState: .Highlighted)
        
        // 设置图片的填充模式为 ScaleAspectFill
        pictBtn.imageView?.contentMode = .ScaleAspectFill
        pictBtn.addTarget(self, action: "addPictBtnDidClick", forControlEvents: .TouchUpInside)
        return pictBtn
    }()
    
    private lazy var deleBtn: UIButton = {
        let btn = UIButton()
        btn.setBackgroundImage(UIImage(named: "compose_photo_close"), forState: .Normal)
        // 需要带个cell 的参数, 点击是删除的 indexPath 对应得item
        btn.addTarget(self, action: "deleteBtnDidClick", forControlEvents: .TouchUpInside)
        return btn
    }()
}

